//
// Created by Leaf on 2025/8/17.
//

#ifndef RECEIVEMODULE_ESP_NOW_H
#define RECEIVEMODULE_ESP_NOW_H

#include <Arduino.h>
#include <esp_now.h>
#include <WiFi.h>

#define ESPNOW_MAX_DATA_LEN 250  // ESP-NOW最大数据长度（固定不可改）
#define ESPNOW_QUEUE_SIZE 10     // 接收队列大小

#define encryption_default  false           // 默认不启用加密
#define encryption_key "1234567890123456"   // 默认加密密钥

// ESP-NOW状态枚举
enum ESPNowState {
    ESPNOW_STATE_UNINITIALIZED,   // 未初始化
    ESPNOW_STATE_INITIALIZING,    // 初始化中
    ESPNOW_STATE_READY,           // 已就绪
    ESPNOW_STATE_ERROR            // 发生错误
};

// 接收数据结构体
typedef struct {
    uint8_t mac_addr[6];          // 对方MAC地址
    uint8_t data[ESPNOW_MAX_DATA_LEN];  // 数据
    uint8_t data_len;             // 数据长度
    unsigned long timestamp;      // 时间戳
} received_data_t;

// ESP-NOW回调函数（C风格）
extern "C" {
void OnDataSent(const uint8_t* mac_addr, esp_now_send_status_t status);
void OnDataRecv(const uint8_t* mac_addr, const uint8_t* data, int data_len);
}

// ESP-NOW管理类
class ESPNowManager {
public:

    ESPNowState currentState;              // 当前ESP-NOW状态
    bool isMaster;                         // 是否为主设备
    uint8_t masterMacAddress[6];           // 对方MAC地址
    esp_now_peer_info_t peerInfo;          // ESP-NOW对等节点信息
    received_data_t receiveQueue[ESPNOW_QUEUE_SIZE];  // 接收队列

    explicit ESPNowManager(bool master = false);

    void setEncryption(bool enable = encryption_default, const char* key = encryption_key);
    void begin(uint8_t broadcastMac[], bool encr = encryption_default, const char* key = encryption_key);

    void sendData(uint8_t* data, uint8_t len);

    void registerSendCallback();
    void registerReceiveCallback();

    ESPNowState getState() const;
    void getLocalMacAddress(uint8_t* mac_addr) const;
    char* getLocalMacAddressString(char* mac_str) const;

};

extern ESPNowManager espNowManager;  // 声明全局ESP-NOW管理器实例

#endif //RECEIVEMODULE_ESP_NOW_H